package com.baizhi.aspect;

import com.alibaba.fastjson.JSON;
import com.baizhi.annotation.LogAnnotation;
import com.baizhi.dao.LogDao;
import com.baizhi.entity.Admin;
import com.baizhi.entity.Log;
import com.baizhi.util.IPKit;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.databind.util.JSONPObject;
import com.google.gson.Gson;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.mvc.condition.RequestConditionHolder;

import javax.jms.Queue;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.lang.reflect.Method;
import java.util.Date;

@Configuration//这是spring项目的配置注解
@Aspect //
public class LogAspect {
    private Logger logger = LoggerFactory.getLogger(LogAspect.class);

    @Autowired(required = false)
    private LogDao logDao;

    @Autowired(required = false)
    private JmsTemplate jmsTemplate;

    @Autowired(required = false)
    private Queue queue;
    /**
     * 1.写增强
     * 2.定义切入点  @annotation(com.baizhi.annotation.LogAnnotation) 切点表达式
     */
    //@After代表最终
    @After("@annotation(com.baizhi.annotation.LogAnnotation)")
    public void lodAfter(JoinPoint joinPoint){
        Log log = new Log();

//        日志信息的采集
        //1：操作时间采集，给时间进行赋值
        log.setLogDate(new Date());

        //2:获取操作的管理员Id，该如何获取，从session中怎样获取
//        第一步从request作用域中获取，他又一个方法是requestContexHolder
        ServletRequestAttributes servletRequestAttributes= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
//        第二步通过servletRequestAttributes。getRequest来获取到作用域中的对象
        HttpServletRequest request = servletRequestAttributes.getRequest();
//        第三步通过session来从request中获取到request中存储的senssion对象
        HttpSession session = request.getSession();
//        第四步，我们需要获取操作人的id，在登录页面已经将他放入到session作用域中了，所以这一步就是从session中取出来
        Admin admin = (Admin) session.getAttribute("admin");
        logger.debug(session.toString());
//        第五步将从session作用域中取到的对象获取到该对象的id并赋值给log
        log.setAdminId(admin.getAdminId());





        //3:获取Ip地址
//        使用ip工具进行获取到ip地址，并将该ip地址赋值给一个字符串
        String ipAddrByRequest = IPKit.getIpAddrByRequest(request);
//        将该字符串放入log对象对应的属性
        log.setLogIp(ipAddrByRequest);

        //4:进行传值
        MethodSignature methodSignature= (MethodSignature) joinPoint.getSignature();
        Method method = methodSignature.getMethod();
        LogAnnotation annotation=method.getAnnotation(LogAnnotation.class);
        String value=annotation.value();
        log.setLogContent(value);

        String type=annotation.type();
        log.setLogType(type);
        logger.debug(log.toString());
        //将日志信息添加到数据库

        //将log转换为json对象

        String s = JSON.toJSONString(log);
        //使用生产者，第一个参数是queue对象，第二个参数是转为json串后的LOG对象
        jmsTemplate.convertAndSend(queue,s);


    }

}
